#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5,V=3e5;
inline int read(){
    int x=0,f=1;char ch=getchar();
    while(!isdigit(ch)){if(ch=='-')f=-1;ch-getchar();}
    while(isdigit(ch)){x=(x<<1)+(x<<3)+ch-48,ch=getchar();}
    return x*f;
}
int n,siz[N];
vector<int> p[N];

bool A=1;
int mx,t[N<<2],ans[N<<2],tot;

int fa1[N<<2],fa2[N<<2];
bool vis1[N<<2],vis2[N<<2];

set<int> s1,s2;

inline int Find1(int x){
    return x==fa1[x]?x:fa1[x]=Find1(fa1[x]);
}
inline int Find2(int x){
    return x==fa2[x]?x:fa2[x]=Find2(fa2[x]);
}

int pos1[N<<2],tot1,pos2[N<<2],tot2;
vector<int> p1,p2;
inline void Add1(int x){
    s1.insert(x);
    vis1[x]=1;
    pos1[++tot1]=x;
    while(!s1.empty()&&(*s1.begin())<x) s1.erase(s1.begin());
    fa1[x]=x+1;
}
inline void Add2(int x){
    s2.insert(x);
    vis2[x]=1;
    pos2[++tot2]=x;
    while(!s2.empty()&&(*s2.begin())<x) s2.erase(s2.begin());
    fa2[x]=x+1;
}

inline void solve(int id1,int id2){
    p1.clear(),p2.clear(),tot1=tot2=0;
    p1.emplace_back(0),p2.emplace_back(0);
    for(int i=siz[id1];i;i--) Add1(p[id1][i]);
    for(int i=siz[id2];i;i--) Add2(p[id2][i]);
    while(!s1.empty()&&!s2.empty()){
        int x=*s1.begin(),y=*s2.begin();
        if(x<y){
            p1.emplace_back(x);
            s1.erase(s1.begin());
        }
        else if(x>y){
            p2.emplace_back(y);
            s2.erase(s2.begin());
        }
        else{
            int sx=Find1(x),sy=Find2(y);
            if(!vis2[sx]&&!vis1[sy]){
                Add1(sx);
                p2.emplace_back(y);
                s2.erase(s2.begin());
            }
            else if(!vis2[sx]){
                Add1(sx);
                p2.emplace_back(y);
                s2.erase(s2.begin());
            }
            else if(!vis1[sy]){
                Add2(sy);
                p1.emplace_back(x);
                s1.erase(s1.begin());
            }
            else{
                if(sx<sy) Add1(sx),s2.erase(s2.begin()),p2.emplace_back(y);
                else Add2(sy),s1.erase(s1.begin()),p1.emplace_back(x);
            }
        }
    }
    while(!s1.empty()) p1.emplace_back(*s1.begin()),s1.erase(s1.begin());
    while(!s2.empty()) p2.emplace_back(*s2.begin()),s2.erase(s2.begin());
    swap(p1,p[id1]);
    swap(p2,p[id2]);
    siz[id1]=p[id1].size()-1;
    siz[id2]=p[id2].size()-1;
    for(int i=1;i<=tot1;i++) vis1[pos1[i]]=0,fa1[pos1[i]]=pos1[i];
    for(int i=1;i<=tot2;i++) vis2[pos2[i]]=0,fa2[pos2[i]]=pos2[i];
}

signed main(){
    freopen("mcmf.in","r",stdin);
    freopen("mcmf.out","w",stdout);
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>siz[i];
        p[i].emplace_back(0);
        for(int x,j=1;j<=siz[i];j++){
            cin>>x;
            p[i].emplace_back(x);
        }
        A&=(siz[i]==1);
    }
    if(A){
        for(int i=1;i<=n;i++) t[p[i][1]]++;
        int lst=0;
        for(int i=1;i<=V;i++){
            if(t[i]){
                for(int j=lst+1;j<i;j++) ans[++tot]=0;
                ans[++tot]=1,lst=i;
                t[i+1]+=(t[i]-1);
            }
        }
        for(int i=tot;i;i--) cout<<ans[i];
    }
    else if(n==1){
        for(int i=1;i<=siz[1];i++) t[p[1][i]]++;
        int lst=0;
        for(int i=1;i<=V;i++){
            if(t[i]){
                for(int j=lst+1;j<i;j++) ans[++tot]=0;
                ans[++tot]=1,lst=i;
                t[i+1]+=(t[i]-1);
            }
        }
        for(int i=tot;i;i--) cout<<ans[i];
    }
    else if(n==2){
        for(int i=1;i<=V;i++) fa1[i]=fa2[i]=i;
        for(int i=1;i<=siz[1];i++) fa1[p[1][i]]=p[1][i]+1,vis1[p[1][i]]=1,s1.insert(p[1][i]);
        for(int i=1;i<=siz[2];i++) fa2[p[2][i]]=p[2][i]+1,vis2[p[2][i]]=1,s2.insert(p[2][i]);
        while(!s1.empty()&&!s2.empty()){
            int x=*s1.begin(),y=*s2.begin();
            if(x<y){
                t[x]++;
                s1.erase(s1.begin());
            }
            else if(x>y){
                t[y]++;
                s2.erase(s2.begin());
            }
            else{
                t[x]++;
                int sx=Find1(x),sy=Find2(y);
                if(!vis2[sx]&&!vis1[sy]){
                    Add1(sx);
                    s2.erase(s2.begin());
                }
                else if(!vis2[sx]){
                    Add1(sx);
                    s2.erase(s2.begin());
                }
                else if(!vis1[sy]){
                    Add2(sy);
                    s1.erase(s1.begin());
                }
                else{
                    if(sx<sy) Add1(sx),s2.erase(s2.begin());
                    else Add2(sy),s1.erase(s1.begin());
                }
            }
        }
        while(!s1.empty()) t[*s1.begin()]++,s1.erase(s1.begin());
        while(!s2.empty()) t[*s2.begin()]++,s2.erase(s2.begin());
        int lst=0;
        for(int i=1;i<=V;i++){
            if(t[i]){
                for(int j=lst+1;j<i;j++) ans[++tot]=0;
                ans[++tot]=1,lst=i;
                t[i+1]+=(t[i]-1);
            }
        }
        for(int i=tot;i;i--) cout<<ans[i];
    }
    else{
        for(int i=1;i<=V;i++) fa1[i]=fa2[i]=i;
        for(int i=1;i<=n;i++)
            for(int j=i+1;j<=n;j++)
                solve(i,j);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=siz[i];j++)
                t[p[i][j]]++;
        int lst=0;
        for(int i=1;i<=V;i++){
            if(t[i]){
                for(int j=lst+1;j<i;j++) ans[++tot]=0;
                ans[++tot]=1,lst=i;
                t[i+1]+=(t[i]-1);
            }
        }
        for(int i=tot;i;i--) cout<<ans[i];
    }
    return 0;
}